package DianShang_2024.ds_server.indicator

import org.apache.spark.sql.functions.first
import org.apache.spark.sql.{DataFrame, SparkSession}

object trait08 {
  def main(args: Array[String]): Unit = {
    /*
            根据dwd或者dws层的数据，请计算每个省份累计订单量，然后根据每个省份订单量从高到低排列，将结果打印到控制台（使用spark中的show算子，同时需要显示列名）
            ；
     */
      //  准备sparksql的环境
    val spark=SparkSession.builder()
        .master("local[*]")
        .appName("指标计算第八题")
        .enableHiveSupport()
        .getOrCreate()

    val data:DataFrame=spark.sql(
      """
        |select
        |province as province_id,
        |count(*) as number
        |from dwd_server.fact_order_master
        |group by province_id
        |order  by number desc
        |""".stripMargin)

          data.show
    /*
          groupBy() 方法表示对整个 DataFrame 进行分组操作，即不指定任何列名进行分组。这样的话将会将整个表看作一个分组
          pivot("province_id") 方法用于将一列的数据转化为字段名
          agg(first("number")) 表示对每个新生成的列，使用 first 聚合函数取出该列第一个非空值作为该列的值。

         agg为聚合函数，对数据进行聚合，里面使用first函数会生成多个零散的值，依次排列在一行数据，然后使用agg聚合，就得到了一行数据
     */

    val result = {
      data.groupBy().pivot("province_id").agg(first("number"))
    }
    //  对省份进行手动排序，参数的顺序就是字段名的顺序
     val result_last=result.select("上海市","江苏省","浙江省","贵州省","广东省")

    result.show
    result_last.show







    //  关闭sparksql的环境
    spark.close()
  }

}
